package reserved

import (
	"JVM/Jvmgo/GoToJVM/instructions/base"
	"JVM/Jvmgo/GoToJVM/native"
	// 这里导入包但是并不使用，只是为了让其中本地方法通过编译，在可执行文件种可以调用
	_ "JVM/Jvmgo/GoToJVM/native/java/lang"
	_ "JVM/Jvmgo/GoToJVM/native/sun/misc"
	"JVM/Jvmgo/GoToJVM/runtimeData"
)

type INVOKE_NATIVE struct {
	base.NoOperandsInstruction
}

func (self *INVOKE_NATIVE) Execute(frame *runtimeData.Frame) {
	// 获取帧中本地方法 类名，方法名，方法描述
	method := frame.Method()
	className := method.Class().Name()
	methodName := method.Name()
	methodDescriptor := method.Descriptor()

	nativeMethod := native.FindNativeMethod(className, methodName, methodDescriptor)
	if nativeMethod == nil {
		methodInfo := className + "." + methodName + methodDescriptor
		panic("java.lang.UnsatisfiedLinkError" + methodInfo)
	}
	// 执行本地方法
	nativeMethod(frame)
}
